package ffprobe

import (
	"bytes"
	"encoding/json"
	"fmt"
	"log"
	"os/exec"
)

// Parse 解析视频内容并转换为MAP
func (p *SFFProbe) Parse() error {
	if p.parse != nil {
		return nil
	}

	// 解析视频数据
	parse, err := p.ParseVideo()
	if err != nil {
		return err
	}

	// 转换为MAP
	var data map[string]interface{}
	if err = json.NewDecoder(parse).Decode(&data); err != nil {
		return fmt.Errorf(`解析文件内容失败%w`, err)
	}

	p.parse = data
	return nil
}

// GetContent 获取视频内容
func (p *SFFProbe) GetContent() map[string]interface{} {
	if err := p.Parse(); err != nil {
		log.Fatalln(err)
	}
	return p.parse
}

// ParseVideo 解析视频内容
func (p *SFFProbe) ParseVideo() (*bytes.Buffer, error) {
	return p.executeCommand()
}

// executeCommand 执行命令解析出视频内容
func (p *SFFProbe) executeCommand() (*bytes.Buffer, error) {
	// 获取视频详情
	cmd := exec.Command(p.driver, "-v", "error", "-show_format", "-show_streams", "-of", "json", p.src)
	var out bytes.Buffer
	cmd.Stdout = &out
	if err := cmd.Run(); err != nil {
		return nil, fmt.Errorf(`获取视频内容失败%w`, err)
	}
	return &out, nil
}
